package com.microservice.common.exception;

import com.microservice.api.common.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.multipart.MaxUploadSizeExceededException;

/**
 * 全局异常处理器
 * 捕获并处理各种异常，返回统一的错误响应
 */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理文件上传大小超限异常
     */
    @ExceptionHandler(MaxUploadSizeExceededException.class)
    public Result<?> handleMaxUploadSizeExceededException(MaxUploadSizeExceededException e) {
        log.error("文件上传大小超限: {}", e.getMessage());
        
        // 提取更友好的错误信息
        String message = "上传文件大小超出限制";
        if (e.getMessage() != null) {
            if (e.getMessage().contains("FileSizeLimitExceededException")) {
                // 尝试提取具体的大小限制信息
                String msg = e.getMessage();
                if (msg.contains("maximum permitted size of")) {
                    int startIdx = msg.indexOf("maximum permitted size of");
                    int endIdx = msg.indexOf("bytes", startIdx);
                    if (startIdx > 0 && endIdx > 0) {
                        String sizeStr = msg.substring(startIdx + 26, endIdx).trim();
                        try {
                            long maxSize = Long.parseLong(sizeStr);
                            long maxSizeMB = maxSize / (1024 * 1024);
                            message = String.format("上传文件大小超出限制，当前限制为 %dMB", maxSizeMB);
                        } catch (NumberFormatException ex) {
                            message = "上传文件大小超出限制，请检查文件大小";
                        }
                    }
                }
            } else {
                message = "上传文件总大小超出限制，请减少文件数量或文件大小";
            }
        }
        
        return Result.error(413, message);
    }
    
    /**
     * 处理运行时异常（包括权限和角色验证失败）
     */
    @ExceptionHandler(RuntimeException.class)
    public Result<?> handleRuntimeException(RuntimeException e) {
        log.error("运行时异常: {}", e.getMessage(), e);
        
        String message = e.getMessage();
        
        // 判断是否是权限或角色相关的异常
        if (message != null && (message.contains("权限") || message.contains("角色") || message.contains("访问被拒绝"))) {
            return Result.error(403, message);
        }
        
        return Result.error(500, message != null ? message : "服务器内部错误");
    }
    
    /**
     * 处理所有未捕获的异常
     */
    @ExceptionHandler(Exception.class)
    public Result<?> handleException(Exception e) {
        log.error("系统异常: {}", e.getMessage(), e);
        return Result.error(500, "服务器内部错误：" + e.getMessage());
    }
}
